﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QButtonGroup>
#include <QMainWindow>
#include <QResizeEvent>

#include <common/deviceattributes.h>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class TemperatureHumiditySensor;
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    /**
     * @brief MainWindow::MainWindow
     * @details 创建主窗口实例并初始化父类。
     * @param parent 父窗口指针，为空则表示顶层窗口。
     */
    MainWindow(QWidget *parent = nullptr);
    /**
     * @brief MainWindow::~MainWindow
     * @details 释放界面资源并处理后台线程收尾。
     */
    ~MainWindow();

private slots:
    /**
     * @brief MainWindow::on_comboBox_currentIndexChanged
     * @details 响应样式下拉框的索引变化。
     * @param index 当前选中的下拉项索引。
     */
    void on_comboBox_currentIndexChanged(int index);
    /**
     * @brief MainWindow::on_closeButton_clicked
     * @details 关闭按钮点击事件处理。
     */
    void on_closeButton_clicked();
    /**
     * @brief MainWindow::on_restoreButton_clicked
     * @details 还原按钮点击事件，在全屏与普通窗口间切换。
     */
    void on_restoreButton_clicked();
    /**
     * @brief MainWindow::on_minimizeButton_clicked
     * @details 最小化按钮点击事件处理。
     */
    void on_minimizeButton_clicked();

    /**
     * @brief MainWindow::slot_groupButtonClicked
     * @details 切换左侧按钮组对应的堆栈页。
     * @param id 按钮组分配的标识索引。
     */
    void slot_groupButtonClicked(int id);
    /**
     * @brief MainWindow::slot_updateDeviceStatus
     * @details 更新设备状态标签的显示样式。
     * @param st 设备状态结构体，包含角色与状态。
     */
    void slot_updateDeviceStatus(const DeviceMeasureStatus &st);
    /**
     * @brief MainWindow::slot_updataData
     * @details 接收温湿度传感器数据并更新界面。
     * @param temp 温度值，单位摄氏度。
     * @param hum 湿度值，百分比表示。
     */
    void slot_updataData(double temp, double hum);
    /**
     * @brief MainWindow::on_helpButton_clicked
     * @details 帮助按钮点击事件，弹出操作菜单。
     */
    void on_helpButton_clicked();

    /**
     * @brief MainWindow::onViewLog
     * @details 打开最新生成的日志文件。
     * @param checked QAction 的选中状态。
     */
    void onViewLog(bool checked = false);
    /**
     * @brief MainWindow::onLanguageChanged
     * @details 语言菜单动作触发时切换应用语言。
     * @param act 触发的语言 QAction。
     */
    void onLanguageChanged(QAction *act);
    /**
     * @brief MainWindow::onShowVersion
     * @details 显示关于对话框与版本信息。
     * @param checked QAction 的选中状态。
     */
    void onShowVersion(bool checked = false);

protected:
    /**
     * @brief MainWindow::mousePressEvent
     * @details 处理鼠标按下以启动拖动或缩放。
     * @param event 鼠标事件指针。
     */
    void mousePressEvent(QMouseEvent *event) override;
    /**
     * @brief MainWindow::mouseMoveEvent
     * @details 鼠标移动时持续驱动拖动或缩放。
     * @param event 鼠标事件指针。
     */
    void mouseMoveEvent(QMouseEvent *event) override;
    /**
     * @brief MainWindow::mouseReleaseEvent
     * @details 鼠标释放后结束拖动或缩放。
     * @param event 鼠标事件指针。
     */
    void mouseReleaseEvent(QMouseEvent *event) override;

private:
    // 判断鼠标在哪一个边缘用于缩放
    /**
     * @brief MainWindow::getResizeEdges
     * @details 判定鼠标位置对应的可缩放边缘。
     * @param pos 鼠标位置。
     * @param margin 触发缩放的边缘宽度。
     * @return 对应的边缘组合标志。
     */
    Qt::Edges getResizeEdges(const QPoint &pos, int margin);
    /**
     * @brief MainWindow::updateCursorShape
     * @details 根据当前鼠标位置调整光标形态。
     * @param pos 鼠标位置。
     */
    void updateCursorShape(const QPoint &pos);
    /**
     * @brief MainWindow::setSysSheet
     * @details 根据索引应用全局样式表。
     * @param index 样式表索引。
     */
    void setSysSheet(int index);
    /**
     * @brief MainWindow::initUI
     * @details 初始化界面控件与信号槽。
     */
    void initUI();
    /**
     * @brief MainWindow::initIconFont
     * @details 加载并设置图标字体。
     */
    void initIconFont();

private:
    Ui::MainWindow *ui;
    // 用于窗口拖动
    bool m_isDragging = false;
    QPoint m_dragStartPosition;

    // 用于窗口缩放
    bool m_isResizing = false;
    QPoint m_resizeStartPosition;
    Qt::Edges m_resizeEdges = 0;
    QButtonGroup *m_leftSidebarBtnGroup = nullptr;

    TemperatureHumiditySensor *m_tempHumSensor = nullptr; //温湿度传感器
    QString m_language = "";
};
#endif // MAINWINDOW_H
